package com.zy.controller;


import com.alibaba.dubbo.config.annotation.Reference;
import com.zy.constant.MessageConstant;
import com.zy.entity.Result;
import com.zy.service.MemberService;
import com.zy.service.ReportService;
import com.zy.service.SetmealService;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
@RequestMapping("/report")
public class ReportController {

	@Reference
	private MemberService memberService;

	@Reference
	private SetmealService setmealService;

	@Reference
	private ReportService reportService;

	/**
	 * 得到图表数据
	 * @return
	 * 返回的数据格式：
	 *            {
	 *                 "data":{
	 *                         "months":["2019.01","2019.02","2019.03","2019.04"],  前12月日期
	 *                         "memberCount":[3,4,8,10]                            对应的会员数量
	 *                        },
	 *                 "flag":true,
	 *                 "message":"获取会员统计数据成功"
	 *             }
	 */
	@RequestMapping("/getMemberReport")
	public Result getMemberReport(){
		HashMap<String, Object> map = null;
		try {
			Calendar calendar = Calendar.getInstance();  //日历对象，获得当前日期
			calendar.add(Calendar.MONTH,-12);//时间往前推12个月
			map = new HashMap<>();

			List<String> months = new ArrayList<>();
			for (int i = 0; i < 12; i++) {
				calendar.add(Calendar.MONTH,1);
				months.add(new SimpleDateFormat("yyyy-MM").format(calendar.getTime()));
			}
			map.put("months",months);

			List<Integer> memberCount = memberService.findMemberCountByMonth(months);
			map.put("memberCount",memberCount);

			return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS,map);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result(false,MessageConstant.GET_MEMBER_NUMBER_REPORT_FAIL);
		}
	}

	/**
	 *
	 * @return
	 *   返回的数据类型：
	 * {
	 * 		"data":{
	 * 			"setmealNames":["套餐1","套餐2","套餐3"],     比较火热的套餐名称（前5名）
	 * 			"setmealCount":[
	 *                            {"name":"套餐1","value":10},  比较火热的套餐名称+人数（前5名）
	 *                            {"name":"套餐2","value":30},
	 *                            {"name":"套餐3","value":25}
	 * 						   ]
	 *           },
	 * 		"flag":true,
	 * 		"message":"获取套餐统计数据成功"
	 * }
	 */
	@RequestMapping("/getSetmealReport")
	public Result getSetmealReport(){

		try {
			Map<String,Object> map = new HashMap<>();

			List<Map> setmealCount = setmealService.findSetmealCount();
			map.put("setmealCount",setmealCount);

			ArrayList<String> setmealNames = new ArrayList<>();
			for (Map map1 : setmealCount) {
				setmealNames.add((String) map1.get("name"));
			}
			map.put("setmealNames",setmealNames);
			return new Result(true,MessageConstant.GET_SETMEAL_COUNT_REPORT_SUCCESS,map);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result(false,MessageConstant.GET_SETMEAL_COUNT_REPORT_FAIL);
		}
	}

	/**
	 *POI报表显示
	 * @return
	 * 数据格式：
	 *{
	 *   "data":{
	 *     "todayVisitsNumber":0,
	 *     "reportDate":"2019-04-25",
	 *     "todayNewMember":0,
	 *     "thisWeekVisitsNumber":0,
	 *     "thisMonthNewMember":2,
	 *     "thisWeekNewMember":0,
	 *     "totalMember":10,
	 *     "thisMonthOrderNumber":2,
	 *     "thisMonthVisitsNumber":0,
	 *     "todayOrderNumber":0,
	 *     "thisWeekOrderNumber":0,
	 *     "hotSetmeal":[
	 *       {"proportion":0.4545,"name":"粉红珍爱(女)升级TM12项筛查体检套餐","setmeal_count":5},
	 *       {"proportion":0.1818,"name":"阳光爸妈升级肿瘤12项筛查体检套餐","setmeal_count":2},
	 *       {"proportion":0.1818,"name":"珍爱高端升级肿瘤12项筛查","setmeal_count":2},
	 *       {"proportion":0.0909,"name":"孕前检查套餐","setmeal_count":1}
	 *     ],
	 *   },
	 *   "flag":true,
	 *   "message":"获取运营统计数据成功"
	 * }
	 */
	@RequestMapping("/getBusinessReportData")
	public Result getBusinessReportData(){
		try {
			Map<String, Object> result = reportService.getBusinessReport();
			return new Result(true,MessageConstant.GET_BUSINESS_REPORT_SUCCESS,result);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result(true,MessageConstant.GET_BUSINESS_REPORT_FAIL);
		}
	}

	/**
	 * POI 报表导出
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("/exportBusinessReport")
	public Result exportBusinessReport(HttpServletRequest request, HttpServletResponse response) throws Exception {
		try {
			Map<String, Object> result = reportService.getBusinessReport();
			//取出返回结果数据，准备将报表数据写入到Excel文件中
			String reportDate = (String) result.get("reportDate");
			Integer todayNewMember = (Integer) result.get("todayNewMember");
			Integer totalMember = (Integer) result.get("totalMember");
			Integer thisWeekNewMember = (Integer) result.get("thisWeekNewMember");
			Integer thisMonthNewMember = (Integer) result.get("thisMonthNewMember");
			Integer todayOrderNumber = (Integer) result.get("todayOrderNumber");
			Integer thisWeekOrderNumber = (Integer) result.get("thisWeekOrderNumber");
			Integer thisMonthOrderNumber = (Integer) result.get("thisMonthOrderNumber");
			Integer todayVisitsNumber = (Integer) result.get("todayVisitsNumber");
			Integer thisWeekVisitsNumber = (Integer) result.get("thisWeekVisitsNumber");
			Integer thisMonthVisitsNumber = (Integer) result.get("thisMonthVisitsNumber");
			List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");

			//加载模板到对象
			String temlateRealPath =request.getSession().getServletContext().getRealPath("template/report_template.xlsx");
			XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(temlateRealPath));
			XSSFSheet sheet = workbook.getSheetAt(0);
			//分别对每一个单元格赋值

			XSSFRow row = sheet.getRow(2);
			row.getCell(5).setCellValue(reportDate);//日期

			row = sheet.getRow(4);
			row.getCell(5).setCellValue(todayNewMember);//新增会员数（本日）
			row.getCell(7).setCellValue(totalMember);//总会员数

			row = sheet.getRow(5);
			row.getCell(5).setCellValue(thisWeekNewMember);//本周新增会员数
			row.getCell(7).setCellValue(thisMonthNewMember);//本月新增会员数

			row = sheet.getRow(7);
			row.getCell(5).setCellValue(todayOrderNumber);//今日预约数
			row.getCell(7).setCellValue(todayVisitsNumber);//今日到诊数

			row = sheet.getRow(8);
			row.getCell(5).setCellValue(thisWeekOrderNumber);//本周预约数
			row.getCell(7).setCellValue(thisWeekVisitsNumber);//本周到诊数

			row = sheet.getRow(9);
			row.getCell(5).setCellValue(thisMonthOrderNumber);//本月预约数
			row.getCell(7).setCellValue(thisMonthVisitsNumber);//本月到诊数

			int rowNum = 12;//表示第13行
			for (Map map : hotSetmeal) {
				String name = (String) map.get("name");
				Long setmeal_count = (Long) map.get("setmeal_count");
				BigDecimal proportion = (BigDecimal) map.get("proportion");
				row = sheet.getRow(rowNum ++);
				row.getCell(4).setCellValue(name);//套餐名称
				row.getCell(5).setCellValue(setmeal_count);//预约数量
				row.getCell(6).setCellValue(proportion.doubleValue());//占比
			}

			//两头一流  -- 进行下载

			//通过流的方式输出到浏览器
			ServletOutputStream out = response.getOutputStream();//当前只知道是流，但是不知道是什么文件类型
			//向客户端声明往回写的是Excel文件类型
			response.setContentType("application/vnd.ms-excel");
			//指定以附件形式下载，如果不指定附件下载，可能会被浏览器直接解析
			response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
			workbook.write(out);

			out.flush();
			out.close();
			workbook.close();
			return new Result(true, MessageConstant.GET_BUSINESS_REPORT_SUCCESS);
		} catch (Exception e) {
			e.printStackTrace();
			return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
		}

	}
}
